local PublicMathFunc={}

--说明: 计算点与点之间的距离
--输入		point1		第一个点		浮点数点
--输入		point2		第二个点		浮点数点
--返回值		val			点与点之间的距离		浮点数
function PublicMathFunc:DistanceP2P(point1,point2)
	 return math.sqrt((point2.x - point1.x)^2 + (point2.y - point1.y)^2)
end

--说明: 计算点与直线之间的垂足和距离
--输入		point		点		浮点数点
--输入		line		直线		直线
--返回值		point1			点到直线之间的垂足		浮点数点
--返回值		distance			直线垂足到点之间的距离		浮点数
function PublicMathFunc:DistanceP2L(point,line)
	local v  = { line.xEnd - line.xStart, line.yEnd - line.yStart}       -- 方向向量
    local sp = {point.x - line.xStart, point.y - line.yStart}       -- 向量 SP
    local len2 = v[1] * v[1] + v[2] * v[2]
    if len2 == 0 then
        -- 直线退化为点，垂足就是那个点
        return  line.xStar,  line.yStar, math.sqrt(sp[1] ^2 + sp[2] ^2)
    end
    local t = (sp[1] * v[1] + sp[2] * v[2])/ len2         -- 投影系数
    local qx = line.xStart + t * v[1]            -- 垂足坐标
    local qy = line.yStart + t * v[2]
    local d  = math.sqrt((point.x - qx)^2 + (point.y - qy)^2)
    return cyRealPoint(qx,qy), d
end

--说明: 计算直线与直线之间的交点、夹角和是否平行
--输入		line1		直线1		直线
--输入		line2		直线2		直线
--返回值		point1			直线1与直线2的交点		浮点数点
--返回值		angle			直线1与直线2的夹角		浮点数
--返回值		isParallel		直线1与直线2的平行		布尔值
function PublicMathFunc:AngleL2L(line1,line2)
    local d1 = {line1.xEnd-line1.xStart, line1.yEnd-line1.yStart}
    local d2 = {line2.xEnd-line2.xStart, line2.yEnd-line2.yStart}
    local denom =d1[1]*d2[2] - d1[2]*d2[1]
    -- 平行或共线
    if math.abs(denom) < 1e-12 then
        return nil,  0, true   -- 无唯一交点，夹角 0°
    end
    local p21 = {line2.xStart-line1.xStart,line2.yStart-line1.yStart}
    local t   = p21[1]*d2[2] - p21[2]*d2[1]/ denom   -- 交点在线1 上的参数
    local ix  = line1.xStart + t * d1[1]
    local iy  = line1.yStart + t * d1[2]
    -- 锐角夹角（0~90°）
	local dot_d1_d2=d1[1]*d2[1] + d1[2]*d2[2]
	local len_d1=math.sqrt(d1[1]*d1[1] + d1[2]*d1[2])
	local len_d2=math.sqrt(d2[1]*d2[1] + d2[2]*d2[2])
    local cosAngle = math.abs(dot_d1_d2) / (len_d1 * len_d2)
    -- 防止浮点误差越界
    cosAngle = math.max(-1, math.min(1, cosAngle))
    local angleDeg = math.deg(math.acos(cosAngle))
    return cyRealPoint(ix, iy) , angleDeg, false
end


return PublicMathFunc